package com.sisbibvir.unmsm.services;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import com.sisbibvir.unmsm.dao.*;
import com.sisbibvir.unmsm.entidades.*;
import java.util.*;


public class TesisService {

	// Objetos DAO
	private JPAUtil objJpaUtil;
	private TesisDAO objTesisDao;
	private LineaInvestigacionDAO objLineaInvestigacionDao;
	private Tag_TesisDAO objTagsTesisDao;
	private LineaTesisDAO objLineaTesisDao;
	private DetalleTagsTesisDAO objDetalleTagsTesisDao;
	private AlumnoTesiDAO objAlumnoTesisDao;
	private AlumnoDAO objAlumnoDao;
	private AsesorDAO objProfesorDao;

	// Objetos normales
	private Tesi objTesis;
	private LineaDeInvestigacion objLineaInvestigacion;
	private List<LineaDeInvestigacion> arrLineaInvestigacion;
	private List<Tesi> arrTesis;
	private TagsTesi objTagsTesis;
	private Lineatesi objLineaTesis;
	private DetalleTagsTesi objDetalleTagsTesis;
	private Alumno objAlumno;
	private Profesor objProfesor;
	private List<Profesor> arrProfesor;

	private String sNombreAlumno1;
	private String sNombreAlumno2;
	private String sAlumnoId1;
	private String sAlumnoId2;
	private String sNombreProfesor;
	private String sFiltroTesis;
	private ArrayList<String> arrTagsTesis;

	// Datos de tesis a actualizar
	private int iCodigoTesis;
	private String slineaTesis;
	private String sTipoTesis;
	private String sAlumnoTesis1;
	private String sAlumnoTesis2;
	private String sTemaTesis;
	private String sResumenTesis;
	private String sNombreArchivoTesis;
	private String sValorTag;

	// private List<String> arrTipoLinea;

	public TesisService() {
		objJpaUtil = new JPAUtil();
		objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
		objLineaInvestigacionDao = new LineaInvestigacionDAO(
				objJpaUtil.getEntityManager());
		objTagsTesisDao = new Tag_TesisDAO(objJpaUtil.getEntityManager());
		objLineaTesisDao = new LineaTesisDAO(objJpaUtil.getEntityManager());
		objDetalleTagsTesisDao = new DetalleTagsTesisDAO(
				objJpaUtil.getEntityManager());
		objAlumnoTesisDao = new AlumnoTesiDAO(objJpaUtil.getEntityManager());
		objAlumnoDao = new AlumnoDAO(objJpaUtil.getEntityManager());
		objProfesorDao = new AsesorDAO(objJpaUtil.getEntityManager());

		objTesis = new Tesi();
		objLineaInvestigacion = new LineaDeInvestigacion();
		objTagsTesis = new TagsTesi();
		objLineaTesis = new Lineatesi();
		objDetalleTagsTesis = new DetalleTagsTesi();
		objAlumno = new Alumno();
		objProfesor = new Profesor();

		arrLineaInvestigacion = objLineaInvestigacionDao.ListarBusqueda("");
		arrTesis = objTesisDao.ListarBusqueda("");
		arrProfesor = objProfesorDao.listarTodos();
		//arrTagsTesis = objTagsTesisDao.ListarStringTags();
		// arrTipoLinea.add("Grupal");
		// arrTipoLinea.add("Individual");

		sNombreAlumno1 = new String();
		sNombreAlumno2 = new String();
		sFiltroTesis = "";

	}

	public void GenerarCodigo() {
		objJpaUtil = new JPAUtil();
		objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
		objTesis.setId(objTesisDao.GenerarCodigo());
		System.out.println(objTesis.getId());
		objJpaUtil = null;
		objTesisDao = null;

	}

	public void FiltrarTesis() {
		try {
			objJpaUtil = new JPAUtil();
			objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
			arrTesis = objTesisDao.ListarBusqueda(sFiltroTesis);
			System.out.println("TesisService: " + sFiltroTesis);
			objJpaUtil = null;
			objTesisDao = null;
			System.gc();
		} catch (Exception e) {
			System.out.println("Error FiltrarTesis :" + e.getMessage());
		}
	}

	public void SeleccionarTesis() {
		try {
			if (objTesis.getId() != 0 || objTesis != null) {
				iCodigoTesis = objTesis.getId();
				objJpaUtil = new JPAUtil();
				objLineaTesisDao = new LineaTesisDAO(
						objJpaUtil.getEntityManager());
				objLineaInvestigacion = objLineaTesisDao
						.BuscarPorTesis(objTesis.getId());

				slineaTesis = objLineaInvestigacion.getDescripcion();
				sTipoTesis = objTesis.getTipo();
				objJpaUtil = new JPAUtil();
				objAlumnoTesisDao = new AlumnoTesiDAO(
						objJpaUtil.getEntityManager());
				List<Alumno> a = objAlumnoTesisDao.ObtenerAlumno(objTesis
						.getId());
				if (a.size() == 2) {
					sAlumnoTesis1 = a.get(0).getId();
					sAlumnoTesis2 = a.get(1).getId();
				} else {
					sAlumnoTesis1 = a.get(0).getId();
				}
				sResumenTesis = objTesis.getResumen();
				sTemaTesis = objTesis.getTitulo();
				//sNombreArchivoTesis = getFiledownload().getName();

				objLineaInvestigacion = null;
				objJpaUtil = null;
				objLineaTesisDao = null;
				objAlumnoDao = null;
			}
		} catch (Exception e) {
			System.out.println("No hay nada seleccionado " + e.getMessage());
		}

	}

	public void FiltrarTesisPorLinea() {
		try {
			if (objLineaInvestigacion.getId() != 0
					|| objLineaInvestigacion != null) {
				objJpaUtil = new JPAUtil();
				objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
				List<Tesi> arr = objTesisDao
						.BuscarPorLinea(objLineaInvestigacion.getId());
				;
				if (arr.size() == 0) {
					arrTesis = null;
				} else {
					arrTesis = arr;
				}
				System.out.println("Numero de tesis " + arrTesis.size()
						+ " en linea con ID: " + objLineaInvestigacion.getId());
				objJpaUtil = null;
				objTesisDao = null;
				System.gc();
			}
		} catch (Exception e) {
			System.out.println("Error en FiltrarTesisPorLinea "
					+ e.getMessage());
		}

	}

	public void ModificarTesis() {

	}

	public void ActualizarTesis() {
		objJpaUtil = new JPAUtil();
		objLineaTesisDao = new LineaTesisDAO(objJpaUtil.getEntityManager());
		objLineaInvestigacion = objLineaTesisDao.BuscarPorTesis(objTesis
				.getId());

		objJpaUtil = new JPAUtil();
		objAlumnoTesisDao = new AlumnoTesiDAO(objJpaUtil.getEntityManager());
		List<Alumno> arrAlumno = objAlumnoTesisDao.ObtenerAlumno(objTesis
				.getId());
		if (arrAlumno.size() > 1) {
			sAlumnoId1 = arrAlumno.get(0).getId();
			sAlumnoId2 = arrAlumno.get(1).getId();
		} else {
			if (arrAlumno.size() == 1) {
				sAlumnoId1 = arrAlumno.get(0).getId();
			}
		}

	}

	/* Inicio de cambios realizados */

	public void VerTesis() { // OK
		objJpaUtil = new JPAUtil();
		objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
		objTesis = objTesisDao.getTesis(objTesis.getId()); // Recibe el objeto
															// del
															// TesisController
															// pero volvemos a
															// traer el objeto
															// con la id para
															// evitar errores
															// posteriores
		objJpaUtil = null; // cerramos las conexiones
		objTesisDao = null;
	}

	public void EliminarTesis() { // OK
		// Previniendo cualquier mala recepcion de objetos llamo al metodo
		// VerTesis ya implementado para traer el objeto completo
		VerTesis();

		objJpaUtil = new JPAUtil();
		objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
		objTesisDao.delete(objTesis);// Elimino el objeto Tesis de la bd y como
										// tiene un delete on cascade se
										// eliminan el detalle tesis asociado a
										// eso

		objJpaUtil = new JPAUtil();
		objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
		arrTesis = objTesisDao.ListarBusqueda("");// Actualizo la lista de tesis
													// disponibles
		objJpaUtil = null; // cerramos las conexiones
		objTesisDao = null;
		System.gc(); // Limpio todo

	}

	public void CrearNuevaTesis() {
		System.out.println("entro a crearnuevatesis  de service");
		objJpaUtil = new JPAUtil();
		objTesisDao = new TesisDAO(objJpaUtil.getEntityManager());
		// creo la tesis
		objTesisDao.create(objTesis); // creo la tesis

		objJpaUtil = new JPAUtil();
		objLineaInvestigacionDao = new LineaInvestigacionDAO(
				objJpaUtil.getEntityManager());
		objLineaInvestigacion = objLineaInvestigacionDao
				.read(objLineaInvestigacion.getId());

		// enlazo las tesis cn la linea de investigacion
		objJpaUtil = new JPAUtil();// abro una conexion
		objLineaTesisDao = new LineaTesisDAO(objJpaUtil.getEntityManager());
		objLineaTesis = new Lineatesi();
		objLineaTesis.setId(objLineaTesisDao.generarCodigo());// genero el
																// codigo de la
																// tabla
																// Linea_Tesis
		objJpaUtil = new JPAUtil();
		objLineaTesisDao = new LineaTesisDAO(objJpaUtil.getEntityManager());
		objLineaTesis.setLineaDeInvestigacion(objLineaInvestigacion);// Enlazo
																		// los
																		// objetos
		objLineaTesis.setTesi(objTesis);
		objLineaTesis.setId(objLineaTesisDao.generarCodigo());
		objJpaUtil = new JPAUtil();
		objLineaTesisDao = new LineaTesisDAO(objJpaUtil.getEntityManager());
		objLineaTesisDao.create(objLineaTesis);
		
		// Ahora la parte de los alumnos con las Tesis

		// enlazo para el alumno 1
		objAlumno = new Alumno();
		objJpaUtil = new JPAUtil();
		objAlumnoDao = new AlumnoDAO(objJpaUtil.getEntityManager());
		objAlumno = objAlumnoDao.read(sAlumnoId1);

		objJpaUtil = new JPAUtil();
		objAlumnoTesisDao = new AlumnoTesiDAO(objJpaUtil.getEntityManager());
		Alumnotesi alumnoTesis = new Alumnotesi();
		alumnoTesis.setId(objAlumnoTesisDao.generarCodigo());
		alumnoTesis.setAlumno(objAlumno);
		alumnoTesis.setTesi(objTesis);

		objJpaUtil = new JPAUtil();
		objAlumnoTesisDao = new AlumnoTesiDAO(objJpaUtil.getEntityManager());
		objAlumnoTesisDao.create(alumnoTesis);

		if (isGrupal(objTesis)) {

			// enlazo para el alumno 2
			objAlumno = new Alumno();
			objJpaUtil = new JPAUtil();
			objAlumnoDao = new AlumnoDAO(objJpaUtil.getEntityManager());
			objAlumno = objAlumnoDao.read(sAlumnoId2);

			objJpaUtil = new JPAUtil();
			objAlumnoTesisDao = new AlumnoTesiDAO(objJpaUtil.getEntityManager());
			alumnoTesis = new Alumnotesi();
			alumnoTesis.setId(objAlumnoTesisDao.generarCodigo());
			alumnoTesis.setAlumno(objAlumno);
			alumnoTesis.setTesi(objTesis);

			objJpaUtil = new JPAUtil();
			objAlumnoTesisDao = new AlumnoTesiDAO(objJpaUtil.getEntityManager());
			objAlumnoTesisDao.create(alumnoTesis);

		}

		// Ingreso los tags y su detalle
		int i = 0, iNumeroTags = arrTagsTesis.size();
		if (iNumeroTags != 0) {
			while (i < iNumeroTags) {
				// Inserto el tag_etsis
				objJpaUtil = new JPAUtil();
				objTagsTesisDao = new Tag_TesisDAO(
						objJpaUtil.getEntityManager());
				objTagsTesis = new TagsTesi();
				objTagsTesis.setId(objTagsTesisDao.GenerarCodigo());
				objTagsTesis.setDescripcion(arrTagsTesis.get(i));

				objJpaUtil = new JPAUtil();
				objTagsTesisDao = new Tag_TesisDAO(
						objJpaUtil.getEntityManager());
				objTagsTesisDao.create(objTagsTesis);

				objJpaUtil = new JPAUtil();
				objDetalleTagsTesisDao = new DetalleTagsTesisDAO(
						objJpaUtil.getEntityManager());
				objDetalleTagsTesis = new DetalleTagsTesi();
				objDetalleTagsTesis.setId(objDetalleTagsTesisDao
						.generarCodigo());
				objDetalleTagsTesis.setTagsTesi(objTagsTesis);
				objDetalleTagsTesis.setTesi(objTesis);

				// enlazo el detalletagstesis con tagstesis
				objJpaUtil = new JPAUtil();
				objDetalleTagsTesisDao = new DetalleTagsTesisDAO(
						objJpaUtil.getEntityManager());
				objDetalleTagsTesisDao.create(objDetalleTagsTesis);

				i++;

			}
		}

		objAlumno = new Alumno();
		objTesis = new Tesi();
		objLineaInvestigacion = new LineaDeInvestigacion();
		objLineaTesis = new Lineatesi();
		objDetalleTagsTesis = new DetalleTagsTesi();
		objTagsTesis = new TagsTesi();

		objJpaUtil = null;
		objAlumnoDao = null;
		objAlumnoTesisDao = null;
		objTesisDao = null;
		objLineaTesisDao = null;
		objDetalleTagsTesisDao = null;
		objTagsTesisDao = null;

	}

	public boolean VerificarNumeroTesis(int num) {
		objJpaUtil = new JPAUtil();
		objAlumnoDao = new AlumnoDAO(objJpaUtil.getEntityManager());
		int iNumeroTesis = -1;
		switch (num) {
		case 1:// Individual
			objAlumno = objAlumnoDao.read(sAlumnoId1);
			iNumeroTesis = objAlumno.getAlumnotesis().size();
			if (iNumeroTesis > 0) {
				System.out.println("El alumno ya tiene asignada una tesis");
				objJpaUtil = null;
				objAlumnoDao = null;
				return false;
			}
			break;
		case 2:// Grupal
			objAlumno = objAlumnoDao.read(sAlumnoId1);
			iNumeroTesis = objAlumno.getAlumnotesis().size();
			if (iNumeroTesis > 0) {
				System.out.println("El alumno ya tiene asignada una tesis");
				objJpaUtil = null;
				objAlumnoDao = null;
				return false;
			}
			objJpaUtil = new JPAUtil();
			objAlumnoDao = new AlumnoDAO(objJpaUtil.getEntityManager());
			objAlumno = objAlumnoDao.read(sAlumnoId2);
			iNumeroTesis = objAlumno.getAlumnotesis().size();
			if (iNumeroTesis > 0) {
				System.out.println("El alumno ya tiene asignada una tesis");
				objJpaUtil = null;
				objAlumnoDao = null;
				return false;
			}
			break;

		}
		objJpaUtil = null;
		objAlumnoDao = null;
		return true;
	}

	public boolean isGrupal(Tesi tesis) {
		if (tesis.getTipo().equalsIgnoreCase("Grupal"))
			return true;
		else
			return false;
	}

	/* Fin de cambios realizados */

	public int getiCodigoTesis() {
		return iCodigoTesis;
	}

	public void setiCodigoTesis(int iCodigoTesis) {
		this.iCodigoTesis = iCodigoTesis;
	}

	public String getSlineaTesis() {
		return slineaTesis;
	}

	public void setSlineaTesis(String slineaTesis) {
		this.slineaTesis = slineaTesis;
	}

	public String getsTipoTesis() {
		return sTipoTesis;
	}

	public void setsTipoTesis(String sTipoTesis) {
		this.sTipoTesis = sTipoTesis;
	}

	public String getsAlumnoTesis1() {
		return sAlumnoTesis1;
	}

	public void setsAlumnoTesis1(String sAlumnoTesis1) {
		this.sAlumnoTesis1 = sAlumnoTesis1;
	}

	public String getsAlumnoTesis2() {
		return sAlumnoTesis2;
	}

	public void setsAlumnoTesis2(String sAlumnoTesis2) {
		this.sAlumnoTesis2 = sAlumnoTesis2;
	}

	public String getsTemaTesis() {
		return sTemaTesis;
	}

	public void setsTemaTesis(String sTemaTesis) {
		this.sTemaTesis = sTemaTesis;
	}

	public String getsResumenTesis() {
		return sResumenTesis;
	}

	public void setsResumenTesis(String sResumenTesis) {
		this.sResumenTesis = sResumenTesis;
	}

	public String getsNombreArchivoTesis() {
		return sNombreArchivoTesis;
	}

	public void setsNombreArchivoTesis(String sNombreArchivoTesis) {
		this.sNombreArchivoTesis = sNombreArchivoTesis;
	}


	public Alumno getObjAlumno() {
		return objAlumno;
	}

	public void setObjAlumno(Alumno objAlumno) {
		this.objAlumno = objAlumno;
	}

	public Profesor getObjProfesor() {
		return objProfesor;
	}

	public void setObjProfesor(Profesor objProfesor) {
		this.objProfesor = objProfesor;
	}

	public List<Profesor> getArrProfesor() {
		return arrProfesor;
	}

	public void setArrProfesor(List<Profesor> arrProfesor) {
		this.arrProfesor = arrProfesor;
	}

	public String getsNombreProfesor() {
		sNombreProfesor = objProfesor.getApellidoP() + " "
				+ objProfesor.getApellidoM();
		return sNombreProfesor;
	}

	public void setsNombreProfesor(String sNombreProfesor) {
		this.sNombreProfesor = sNombreProfesor;
	}

	public Tesi getObjTesis() {
		return objTesis;
	}

	public void setObjTesis(Tesi objTesis) {
		this.objTesis = objTesis;
	}

	public LineaDeInvestigacion getObjLineaInvestigacion() {
		return objLineaInvestigacion;
	}

	public void setObjLineaInvestigacion(
			LineaDeInvestigacion objLineaInvestigacion) {
		this.objLineaInvestigacion = objLineaInvestigacion;
	}

	public List<LineaDeInvestigacion> getArrLineaInvestigacion() {
		return arrLineaInvestigacion;
	}

	public void setArrLineaInvestigacion(
			List<LineaDeInvestigacion> arrLineaInvestigacion) {
		this.arrLineaInvestigacion = arrLineaInvestigacion;
	}

	public TagsTesi getObjTagsTesis() {
		return objTagsTesis;
	}

	public void setObjTagsTesis(TagsTesi objTagsTesis) {
		this.objTagsTesis = objTagsTesis;
	}

	public Lineatesi getObjLineaTesis() {
		return objLineaTesis;
	}

	public void setObjLineaTesis(Lineatesi objLineaTesis) {
		this.objLineaTesis = objLineaTesis;
	}

	public DetalleTagsTesi getObjDetalleTagsTesis() {
		return objDetalleTagsTesis;
	}

	public void setObjDetalleTagsTesis(DetalleTagsTesi objDetalleTagsTesis) {
		this.objDetalleTagsTesis = objDetalleTagsTesis;
	}

	public String getsNombreAlumno1() {
		return sNombreAlumno1;
	}

	public void setsNombreAlumno1(String sNombreAlumno1) {
		this.sNombreAlumno1 = sNombreAlumno1;
	}

	public String getsNombreAlumno2() {
		return sNombreAlumno2;
	}

	public void setsNombreAlumno2(String sNombreAlumno2) {
		this.sNombreAlumno2 = sNombreAlumno2;
	}

	public String getsAlumnoId1() {
		return sAlumnoId1;
	}

	public void setsAlumnoId1(String sAlumnoId1) {
		this.sAlumnoId1 = sAlumnoId1;
	}

	public String getsAlumnoId2() {
		return sAlumnoId2;
	}

	public void setsAlumnoId2(String sAlumnoId2) {
		this.sAlumnoId2 = sAlumnoId2;
	}

	public List<Tesi> getArrTesis() {
		return arrTesis;
	}

	public void setArrTesis(List<Tesi> arrTesis) {
		this.arrTesis = arrTesis;
	}

	public String getsFiltroTesis() {
		return sFiltroTesis;
	}

	public void setsFiltroTesis(String sFiltroTesis) {
		this.sFiltroTesis = sFiltroTesis;
	}

	public String getsValorTag() {
		return sValorTag;
	}

	public void setsValorTag(String sValorTag) {
		this.sValorTag = sValorTag;
	}

	public ArrayList<String> getArrTags() {
		return arrTagsTesis;
	}

	public void setArrTags(ArrayList<String> arrTags) {
		this.arrTagsTesis = arrTags;
	}

}
